#include <iostream>
#include <thread>
#include <mutex>

using std::cout;
using std::endl;
using std::thread;
using std::mutex;

int gCnt = 0;
mutex mtx;//创建互斥锁
mutex mtx2;//创建互斥锁

class MutexLock
{
public:
    MutexLock(mutex &mu)
    : _mtx(mu)
    {
        _mtx.lock();//上锁
    }

    ~MutexLock()
    {
        _mtx.unlock();//解锁
    }
private:
    mutex &_mtx;//数据成员
};

//任何一个线程都将gCnt这样一个全局变量加100w次
void threadFunc()
{
    for(size_t idx = 0; idx != 1000000; ++idx)
    {
        //自己封装了MutexLock，利用RAII的思想，在构造函数中上锁
        //在析构函数中解锁，利用栈对象的生命周期管理锁资源
        //以后就只用创建MutexLock的栈对象
        MutexLock ml(mtx2);
        ++gCnt;
    }
}
//线程的执行是随机的
int main(int argc, char *argv[])
{
    thread thA(threadFunc);
    thread thB(threadFunc);

    thA.join();
    thB.join();

    cout << "gCnt = " << gCnt << endl;

    return 0;
}

